<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>js基础学习笔记</title>
</head>

<body>
  <script>
    //考察undefined和null是否相同
    var un = undefined
    console.log(un == null) //==判断值，
    console.log(null === undefined) //===会判断类型
    //!!的使用：用于将object类型转化为布尔类型
    const obj = {
      name: "chy",
      age: 18,
      coding: () => {
        console.log('我在写代码')
      }
    }
    obj.coding()
    //判断obj的不二值
    console.log(!!obj)
    //js生成0-99的随机数
    const num = Math.random() * 100 //random默认是[0,1)
    console.log(Math.floor(num)) //向下取整函数
    //函数内部都有arguments 
    function fun(name, age) {
      console.log(arguments);
      console.log(this);
    }
    fun("chy", 18)
    //js中函数的返回值可以是一个函数
    function sayHello(name) {
      console.log(name);
      /*  return function hi(){
         console.log('欢迎来到js的世界')
       } */
      //也可以返回一个箭头函数
      return () => {
        console.log('我是一个箭头函数');
      }
    }
    const result = sayHello('chy')
    result();
    //立即执行函数的定义，定义完后就会立即执行了！
    (function () {
      console.log('我是立即执行函数，定义完成后就立刻执行');
    })();
    //既然是立即执行函数，也就可以使用箭头函数来代替
    (() => {
      console.log('我是一个立即执行的箭头函数')
    })();
    //js调试技巧,使用debugger
    //debugger //使用debugger，代码就会在debugger这里挺住，也就是断点
    /*  function demo(){
        const cnt=10
        while(cnt--){
          console.log(cnt);
        }
     } */
    //setTimeout函数：让函数延迟执行
    setTimeout(() => {
      console.log("两秒后执行函数");
    }, 2000)
    //for in 遍历对象
    const person = {
      name: "chy",
      age: 18
    }
    for (const key in person) {
      console.log(person[key])
    }
    //js中this的作用，函数默认调用指向window全局对象
    fun()
    //js的构造函数
    function coder(name, age, behavor) {
      this.name = name
      this.age = age
      this.behavor = behavor
    }
    //使用new关键字进行创建对象
    const a = new coder("chy", 18, () => {
      console.log('写代码');
    })
    //数组中间添加和删除元素
    const langs = ["C++", "Java", "Python", "PHP"]
    //中间删除元素，使用splice方法
    langs.splice(1, 2) //预期剩下C++和PHP
    for (let i = 0; i < langs.length; ++i) {
      console.log(langs[i]);
    }
    //新增元素，第二个参数设置为0就是新增
    langs.splice(1, 0, "Rust", "Go")
    console.log(langs);
    //修改元素
    langs.splice(1,2,"JS","ts")
    //ES6拓展语法,使用...可以拓展数组
    const arr=['1','2','3']
    //等价于push('1' '2' '3')
    langs.push(...arr)
    langs.forEach(()=>{
      console.log('遍历');
    })
  console.log(langs);
  //数组的filter函数，生成[0,100)的元素，并将搜索出对应的偶数
  const nums=[]
  for(let i=0;i<5;++i){
    let t=Math.floor(Math.random()*100) //生成0-99的整数
    nums.push(t)
  }
  console.log(nums);//打印生成的随机数数组
  const newNums=nums.filter(item => item %2 ==0)
  console.log(newNums);//筛选偶数的集合
   //sort函数可以对数组进行排序
  const demo=[10,3,7,999,23,44,99,77]
  //sort可以传递一个排序规则的箭头函数
   let res1=demo.sort((item1,item2)=>{
    return item1 - item2 //这种默认就是升序,降序就是反过来相减
  })
  console.log(res1) 
  //map函数,根据对应的指定规则生成新的数组，本例中生成对应的平方信息
  let res2=demo.map((item)=>{
    return item*item
  })
  //reduce函数：起到累加功能
  console.log(res2);
  let res3=demo.reduce((prev,item)=>{
    return prev+item
  },0) //第二个参数是一个累加的初始值
  console.log(res3);
  </script>
</body>

</html>